# -*- coding:utf-8 -*-
import requests
import json
from langchain.prompts import PromptTemplate
from config import URL, MODEL_NAME


def analyze_boat_flow_api_data(question, sql_result, action_name, session_messages):
    """基于SQL查询结果生成数据分析报告（流式输出）

    Args:
        question: 需要分析的业务问题
        sql_result: SQL查询结果字符串

    Returns:
        生成器，逐块返回分析报告内容
    """
    if action_name == 'vessel_trajectory':
        analysis_prompt = PromptTemplate.from_template(
            """
    你是一名经验丰富的港航专业人士。请你根据问题 {test_question} 和提供的【船舶轨迹结构化查询结果】{sql_result} ，以业务视角进行如下专业解读：

    若查询【船舶轨迹结构化查询结果】非空，请分一下三点总结：

    1. 航行路线与卡口通行情况
        - 列出船舶按时间顺序通过的卡口（含名称、时间、方向、载重状态）。
        - 简要推断航次作业流程（如装卸货节奏、进出港循环等），单位为航次。
    2. 载重状态变化
        - 指明载重状态变化及相应时间，分析是否符合正常作业规律。
    3. 航速与运输效率
        - 简要评述主要航段航速数据及其效率表现。速度单位为节。

    结尾请给出1-2句综合分析结论，突出业务价值或风险洞察。

    若查询【船舶轨迹结构化查询结果】为空，请按以下要求作答：
        - 提供简明的数据分析结论；
        - 分析无数据的可能原因（如数据缺失、查询日期等条件限制、船舶实际未运行等）；
        - 提出2-3个有针对性的后续问题，帮助用户进一步聚焦需求和补充关键信息。

    # 说明
     - 务必结构简介清晰、表达专业、直奔业务价值核心
     - 避免无效的数据复述
     - 避免出现英文单词或描述
     - 避免输出Markdown格式
            """
        )

    elif action_name == 'checkpoint_traffic':
        analysis_prompt = PromptTemplate.from_template(
            """
    你是一名经验丰富的港航专业人士。请你根据问题 {test_question} 和提供的【卡口/闸口每日流量结构化数据结果】{sql_result} ，以业务视角进行如下专业解读：

    若查询【卡口/闸口每日流量结构化数据结果】非空，请按以下四点总结：

    1. 总体流量水平与趋势
        - 统计通行总流量、入沪流量、出沪流量，计算累计数值，单位为艘（次）。
        - 关注波动（高低峰等数值和趋势）
        - 重点关注高峰、低谷、零流量或异常现象，并分析可能业务原因。

    2. 船型和货种结构
        - 统计各主要船型（干散货、散水泥、油船、化学品、多用途、杂项等）的占比及变化，分析主力运输类型以及特殊货种进出情况。

    3. 入沪出沪流量结构
        - 分析入沪出沪船舶流量及比例分布，指出有无显著失衡或异常，结合业务逻辑简明解释。

    4. 业务洞察与管理建议
        - 综合流量结构，点评运力/货种集中度和运营特性，并对调度安排、运力优化或管理决策提出建设性建议。

    结尾用1-2句话，简要总结该卡口/闸口分析期内的业务特点和管理参考意义。

    若查询【卡口/闸口每日流量结构化数据结果】为空，请严格按以下要求作答：
    1. 简明陈述“未获取到相关流量数据”。
    2. 分析无数据的可能原因（如数据缺失、采集异常、查询日期/口径限定、卡口停运等）。
    3. 提出2-3条进一步沟通建议/问题，例如：
        - 是否确认时间范围选择正确？
        - 是否需要扩大查询日期或更换卡口？

    # 说明
     - 务必结构简介清晰、数据清楚、表达专业、直奔业务价值核心
     - 全程需直接引用具体数据支撑
     - 禁止出现英文和Markdown格式
            """
        )

    elif action_name == 'violation_detection':
        analysis_prompt = PromptTemplate.from_template(
            """
    你是一名经验丰富的港航专业人士。请你根据问题 {test_question} 和提供的【船舶预警/违规结构化结果】{sql_result} ，以业务视角进行如下专业解读：

    若【船舶预警/违规结构化结果】非空，请按以下四点总结：
    1. 违规类型分布与高发行为
        - 分类归纳本期内主要违规类型及出现频次，突出高频、重复、不合规风险高的行为。

    2.时空分布及场景特征
        - 梳理违规模块的高发卡口/闸口、时间密集期及其业务背景，剖析管理短板。

    3. 违规关联与根因简析
        - 简析多项违规并发/重复等现象，推断潜在管理或操作原因。

    4. 业务风险与整改建议
        - 明确违规对合规、运营和安全的影响，提出针对性优化/整改建议。

    结尾用1-2句话概括该船舶近期合规风险和管控重点。

    若【船舶预警/违规结构化结果】为空，请严格遵循如下标准作答：
    1. 简明陈述“本次未检索到该船舶相关预警或违规记录”。
    2. 跟进提问：提出2-3个具体问题，指导用户进一步补充或细化需求，例如：
        - 是否需放宽时间范围或更换查询对象？
        - 是否需同时查询其他船舶、卡口或预警类型？

    # 说明
     - 务必结构简介清晰、表达专业、直奔业务价值核心
     - 避免无效的数据复述
     - 避免出现英文单词或描述
     - 避免输出Markdown格式
            """
        )

    elif action_name == 'spatial_computing_channel':
        analysis_prompt = PromptTemplate.from_template(
            """
    你是一名经验丰富的港航专业人士。请你根据问题 {test_question} 和提供的【船舶数据】{sql_result} ，以业务视角进行如下专业解读：

    若【船舶数据】非空，请按以下三点总结：
    1. 该时间段经过船舶总数量：
        - 从问题中获取时间段，根据{sql_result}中字段为‘船舶总数量’的值，输出此时间段内经过的船舶总数量。
        - 从问题中获取航道，根据此航道特点和时间段内通过的船舶总数量结合港航业务做分析。

    2.各类型船舶数量：
        - 从{sql_result}中获取字段为‘各类型船舶数量’的值，获取各类型船舶数量，并列出Top5（空值null不计入）的船舶类型和对应数量，结合航道和业务分析各类船舶类型数量多少的原因。
        - 列出出现空值（null）的数量，并说明：此类为通行船舶，但无船舶信息。

    3. 危险品船舶总数量
        - 根据{sql_result}中字段为‘危险品船舶总数量’的值，计算所有危险品船舶数量之和并输出，分析该航道出现此数量危险品船舶数量原因。
        - 列出所有数量不为0的危险品船舶具体类型和对应数量。

    结尾用1-2句话概括该航道船舶通行特点。

    若【船舶数据】为空，请严格遵循如下标准作答：
    1. 简明陈述“本次未检索到该航道船舶记录”。
    2. 跟进提问：提出2-3个具体问题，指导用户进一步补充或细化需求，例如：
        - 是否需放宽时间范围或更换查询航道？

    # 说明
     - 务必结构简介清晰、表达专业、直奔业务价值核心
     - 避免无效的数据复述
     - 避免出现英文单词或描述
     - 避免输出Markdown格式
            """
        )

    elif action_name == 'spatial_computing_boat':
        analysis_prompt = PromptTemplate.from_template(
            """
    你是一名经验丰富的港航专业人士。请你根据问题 {test_question} 和提供的【航道数据】{sql_result} ，以业务视角进行如下专业解读：

    若【航道数据】非空，请按以下三点总结：
    1. 该时间段经过航道名称：
        - 从问题中获取时间段，根据{sql_result}中字段为‘航道’的值，输出此时间段内经过的航道名称。

    结尾用1-2句话概括该船舶经过航道的通行特点。

    若【航道数据】为空，请严格遵循如下标准作答：
    1. 简明陈述“本次未检索到该船舶经过航道的数据”或“该船舶此时间段内未经过所记录的航道”。
    2. 跟进提问：提出2-3个具体问题，指导用户进一步补充或细化需求，例如：
        - 是否需放宽时间范围或更换查询船舶？

    # 说明
     - 务必结构简介清晰、表达专业、直奔业务价值核心
     - 避免无效的数据复述
     - 避免出现英文单词或描述
     - 避免输出Markdown格式
            """
        )

    elif action_name == 'not matched':
        analysis_prompt = PromptTemplate.from_template(
            """
    你是一名经验丰富的港航专业人士。请你根据问题 {test_question} 和提供的【结构化结果】{sql_result} ，以业务视角进行如下专业解读：

    若【结构化结果】{sql_result} 非空，请按以下总结：
    1. 数据的简明分析，注重数据的单位
    2. 关键业务见解

    若【结构化结果】{sql_result} 为空，请严格遵循如下标准作答：
    1. 简明陈述“无结果返回”
    2. 分析可能的原因（数据缺失、查询日期条件限制等）  
    3. 提出2-3个相关的跟进问题，帮助进一步明确用户需求

    # 说明
     - 务必结构简介清晰、表达专业、直奔业务价值核心
     - 避免无效的数据复述
     - 避免输出Markdown格式
     - 避免出现表名称或表字段的英文名称
     - 避免生成虚拟数据
            """
        )

    else:
        analysis_prompt = PromptTemplate.from_template(
            """根据问题：{test_question}  
    SQL查询结果：{sql_result}  
    根据SQL查询结果分为两种情况，根据实际返回的结果，选择其中的一个回复问题
    - 如果有查询结果，请提供：  
        1. 数据的简明分析
        2. 关键业务见解

    - 如果查询结果为空，请提供：  
        1. 数据的简明分析
        2. 分析可能的原因（数据缺失、查询日期条件限制等）  
        3. 提出2-3个相关的跟进问题，帮助进一步明确用户需求

    使用简洁专业的语言，避免冗余解释和Markdown格式。避免出现英文单词或描述。
            """
        )

    formatted_prompt = analysis_prompt.format(
        test_question=question,
        sql_result=sql_result
    )

    if not session_messages:
        messages = [
            {"role": "system", "content": "你是一个专业的数据分析助理，擅长解读SQL查询结果并提出业务建议"},
            {"role": "user", "content": formatted_prompt}
        ]
    else:
        messages = [
            {"role": "system", "content": "结合以下之前多轮问答的问题和回答,回答最新提问：根据查询的结果回答相应的问题"},
            *session_messages,
            {"role": "user", "content": formatted_prompt}
        ]

    data = {
        "model": MODEL_NAME,
        "messages": messages,
        "temperature": 0.1,
        "presence_penalty": 0.4,
        "frequency_penalty": 0.7,
        "stream": True
    }

    response = requests.post(
        URL,
        data=json.dumps(data),
        stream=True,
        headers={'Content-Type': 'application/json'}
    )
    response.raise_for_status()

    # 返回生成器，逐块返回内容
    for chunk in response.iter_lines():
        if chunk:
            decoded = json.loads(chunk.decode('utf-8'))
            if 'message' in decoded and 'content' in decoded['message']:
                content = decoded['message']['content']
                yield content  # 直接返回每个内容块

# 使用示例（外部处理流式响应）
# if __name__ == "__main__":
#     action_name = "checkpoint_traffic"
#     question = "分析2025年1月油墩港(东大盈船闸)每天的流量组成"
#     sql_result = """{'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-01 00:00:00', 'TOTAL': 42, 'OUTCOUNT': 20, 'INCOUNT': 25, 'DRYSHIP': 28, 'OILSHIP': 0, 'BULKSHIP': 0, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 9, 'MULTIPURPOSESHIP': 0, 'OTHER': 0, 'ZD': 12282}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-02 00:00:00', 'TOTAL': 45, 'OUTCOUNT': 23, 'INCOUNT': 31, 'DRYSHIP': 23, 'OILSHIP': 0, 'BULKSHIP': 1, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 15, 'MULTIPURPOSESHIP': 0, 'OTHER': 0, 'ZD': 13510}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-03 00:00:00', 'TOTAL': 64, 'OUTCOUNT': 54, 'INCOUNT': 39, 'DRYSHIP': 48, 'OILSHIP': 0, 'BULKSHIP': 1, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 7, 'MULTIPURPOSESHIP': 0, 'OTHER': 1, 'ZD': 17795}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-04 00:00:00', 'TOTAL': 62, 'OUTCOUNT': 38, 'INCOUNT': 30, 'DRYSHIP': 40, 'OILSHIP': 0, 'BULKSHIP': 1, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 16, 'MULTIPURPOSESHIP': 0, 'OTHER': 1, 'ZD': 19555}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-05 00:00:00', 'TOTAL': 55, 'OUTCOUNT': 35, 'INCOUNT': 30, 'DRYSHIP': 30, 'OILSHIP': 0, 'BULKSHIP': 0, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 10, 'MULTIPURPOSESHIP': 0, 'OTHER': 1, 'ZD': 14743}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-06 00:00:00', 'TOTAL': 69, 'OUTCOUNT': 57, 'INCOUNT': 63, 'DRYSHIP': 38, 'OILSHIP': 0, 'BULKSHIP': 3, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 6, 'MULTIPURPOSESHIP': 0, 'OTHER': 2, 'ZD': 39303}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-07 00:00:00', 'TOTAL': 60, 'OUTCOUNT': 72, 'INCOUNT': 41, 'DRYSHIP': 34, 'OILSHIP': 0, 'BULKSHIP': 0, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 10, 'MULTIPURPOSESHIP': 0, 'OTHER': 3, 'ZD': 17636}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-08 00:00:00', 'TOTAL': 48, 'OUTCOUNT': 31, 'INCOUNT': 26, 'DRYSHIP': 37, 'OILSHIP': 0, 'BULKSHIP': 0, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 7, 'MULTIPURPOSESHIP': 0, 'OTHER': 0, 'ZD': 14261}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-09 00:00:00', 'TOTAL': 43, 'OUTCOUNT': 29, 'INCOUNT': 21, 'DRYSHIP': 30, 'OILSHIP': 0, 'BULKSHIP': 0, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 9, 'MULTIPURPOSESHIP': 0, 'OTHER': 0, 'ZD': 12211}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-10 00:00:00', 'TOTAL': 42, 'OUTCOUNT': 29, 'INCOUNT': 26, 'DRYSHIP': 27, 'OILSHIP': 0, 'BULKSHIP': 1, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 9, 'MULTIPURPOSESHIP': 0, 'OTHER': 1, 'ZD': 13445}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-11 00:00:00', 'TOTAL': 60, 'OUTCOUNT': 28, 'INCOUNT': 38, 'DRYSHIP': 38, 'OILSHIP': 0, 'BULKSHIP': 1, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 12, 'MULTIPURPOSESHIP': 0, 'OTHER': 5, 'ZD': 16838}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-12 00:00:00', 'TOTAL': 28, 'OUTCOUNT': 25, 'INCOUNT': 29, 'DRYSHIP': 17, 'OILSHIP': 0, 'BULKSHIP': 2, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 5, 'MULTIPURPOSESHIP': 0, 'OTHER': 0, 'ZD': 9370}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-13 00:00:00', 'TOTAL': 43, 'OUTCOUNT': 28, 'INCOUNT': 34, 'DRYSHIP': 25, 'OILSHIP': 0, 'BULKSHIP': 1, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 11, 'MULTIPURPOSESHIP': 0, 'OTHER': 1, 'ZD': 11572}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-14 00:00:00', 'TOTAL': 60, 'OUTCOUNT': 35, 'INCOUNT': 38, 'DRYSHIP': 39, 'OILSHIP': 0, 'BULKSHIP': 1, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 13, 'MULTIPURPOSESHIP': 0, 'OTHER': 1, 'ZD': 17447}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-15 00:00:00', 'TOTAL': 51, 'OUTCOUNT': 28, 'INCOUNT': 31, 'DRYSHIP': 33, 'OILSHIP': 0, 'BULKSHIP': 2, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 10, 'MULTIPURPOSESHIP': 0, 'OTHER': 0, 'ZD': 14757}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-16 00:00:00', 'TOTAL': 43, 'OUTCOUNT': 18, 'INCOUNT': 26, 'DRYSHIP': 27, 'OILSHIP': 0, 'BULKSHIP': 1, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 11, 'MULTIPURPOSESHIP': 0, 'OTHER': 1, 'ZD': 12490}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-17 00:00:00', 'TOTAL': 59, 'OUTCOUNT': 38, 'INCOUNT': 31, 'DRYSHIP': 47, 'OILSHIP': 0, 'BULKSHIP': 0, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 7, 'MULTIPURPOSESHIP': 0, 'OTHER': 3, 'ZD': 17763}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-18 00:00:00', 'TOTAL': 55, 'OUTCOUNT': 24, 'INCOUNT': 32, 'DRYSHIP': 38, 'OILSHIP': 0, 'BULKSHIP': 1, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 8, 'MULTIPURPOSESHIP': 0, 'OTHER': 2, 'ZD': 15071}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-19 00:00:00', 'TOTAL': 42, 'OUTCOUNT': 19, 'INCOUNT': 26, 'DRYSHIP': 27, 'OILSHIP': 0, 'BULKSHIP': 2, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 7, 'MULTIPURPOSESHIP': 0, 'OTHER': 1, 'ZD': 12428}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-20 00:00:00', 'TOTAL': 21, 'OUTCOUNT': 8, 'INCOUNT': 13, 'DRYSHIP': 13, 'OILSHIP': 0, 'BULKSHIP': 0, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 5, 'MULTIPURPOSESHIP': 0, 'OTHER': 2, 'ZD': 6271}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-21 00:00:00', 'TOTAL': 28, 'OUTCOUNT': 9, 'INCOUNT': 19, 'DRYSHIP': 17, 'OILSHIP': 0, 'BULKSHIP': 0, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 6, 'MULTIPURPOSESHIP': 0, 'OTHER': 3, 'ZD': 8399}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-22 00:00:00', 'TOTAL': 14, 'OUTCOUNT': 12, 'INCOUNT': 2, 'DRYSHIP': 9, 'OILSHIP': 0, 'BULKSHIP': 0, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 1, 'MULTIPURPOSESHIP': 0, 'OTHER': 0, 'ZD': 4075}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-23 00:00:00', 'TOTAL': 6, 'OUTCOUNT': 3, 'INCOUNT': 3, 'DRYSHIP': 2, 'OILSHIP': 0, 'BULKSHIP': 0, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 2, 'MULTIPURPOSESHIP': 0, 'OTHER': 1, 'ZD': 1508}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-24 00:00:00', 'TOTAL': 4, 'OUTCOUNT': 1, 'INCOUNT': 3, 'DRYSHIP': 0, 'OILSHIP': 0, 'BULKSHIP': 0, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 1, 'MULTIPURPOSESHIP': 0, 'OTHER': 2, 'ZD': 993}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-25 00:00:00', 'TOTAL': 4, 'OUTCOUNT': 0, 'INCOUNT': 4, 'DRYSHIP': 4, 'OILSHIP': 0, 'BULKSHIP': 0, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 0, 'MULTIPURPOSESHIP': 0, 'OTHER': 0, 'ZD': 1320}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-26 00:00:00', 'TOTAL': 2, 'OUTCOUNT': 1, 'INCOUNT': 1, 'DRYSHIP': 0, 'OILSHIP': 0, 'BULKSHIP': 0, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 0, 'MULTIPURPOSESHIP': 0, 'OTHER': 2, 'ZD': 272}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-27 00:00:00', 'TOTAL': 0, 'OUTCOUNT': 0, 'INCOUNT': 0, 'DRYSHIP': 0, 'OILSHIP': 0, 'BULKSHIP': 0, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 0, 'MULTIPURPOSESHIP': 0, 'OTHER': 0, 'ZD': 0}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-28 00:00:00', 'TOTAL': 1, 'OUTCOUNT': 1, 'INCOUNT': 0, 'DRYSHIP': 0, 'OILSHIP': 0, 'BULKSHIP': 0, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 0, 'MULTIPURPOSESHIP': 0, 'OTHER': 1, 'ZD': 136}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-29 00:00:00', 'TOTAL': 0, 'OUTCOUNT': 0, 'INCOUNT': 0, 'DRYSHIP': 0, 'OILSHIP': 0, 'BULKSHIP': 0, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 0, 'MULTIPURPOSESHIP': 0, 'OTHER': 0, 'ZD': 0}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-30 00:00:00', 'TOTAL': 0, 'OUTCOUNT': 0, 'INCOUNT': 0, 'DRYSHIP': 0, 'OILSHIP': 0, 'BULKSHIP': 0, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 0, 'MULTIPURPOSESHIP': 0, 'OTHER': 0, 'ZD': 0}, {'BAYONETNAME': '油墩港(东大盈船闸)', 'PASS_DATE': '2025-01-31 00:00:00', 'TOTAL': 0, 'OUTCOUNT': 0, 'INCOUNT': 1, 'DRYSHIP': 0, 'OILSHIP': 0, 'BULKSHIP': 0, 'BULKCHEMICALSHIP': 0, 'BULKCEMENTSHIP': 0, 'MULTIPURPOSESHIP': 0, 'OTHER': 0, 'ZD': 0}"""
#     sql_result = sql_result_processor(sql_result)
#     print(sql_result)
# # sql_result = ""

# action_name = "violation_detection"
# question = "船舶 兴安太518 2025年04月1日到4月16日有哪些违规的行为？"
# sql_result = """{'warntime': '2025-04-16 15:15:08', 'boatname': '兴安太518', 'warntype': '国旗未悬挂', 'passtime': '2025-04-16 13:45:34', 'bayonetname': '金汇港(北闸)'}, {'warntime': '2025-04-16 15:14:49', 'boatname': '兴安太518', 'warntype': '超限预警', 'passtime': '2025-04-16 13:45:34', 'bayonetname': '金汇港(北闸)'}, {'warntime': '2025-04-14 16:24:08', 'boatname': '兴安太518', 'warntype': '未申报预警', 'passtime': '2025-04-14 16:23:00', 'bayonetname': '苏申内港线(上港宜东)'}, {'warntime': '2025-04-14 07:21:08', 'boatname': '兴安太518', 'warntype': '未申报预警', 'passtime': '2025-04-14 07:14:49', 'bayonetname': '苏申内港线(上港宜东)'}, {'warntime': '2025-04-13 07:26:31', 'boatname': '兴安太518', 'warntype': '超限预警', 'passtime': '2025-04-13 07:24:44', 'bayonetname': '金汇港(北闸)'}, {'warntime': '2025-04-11 20:50:31', 'boatname': '兴安太518', 'warntype': '超限预警', 'passtime': '2025-04-11 20:46:59', 'bayonetname': '金汇港(北闸)'}, {'warntime': '2025-04-07 09:06:48', 'boatname': '兴安太518', 'warntype': '超限预警', 'passtime': '2025-04-07 09:03:42', 'bayonetname': '金汇港(北闸)'}, {'warntime': '2025-04-06 10:17:45', 'boatname': '兴安太518', 'warntype': '未穿救生衣', 'passtime': '2025-04-06 10:14:39', 'bayonetname': '金汇港(北闸)'}, {'warntime': '2025-04-06 10:17:25', 'boatname': '兴安太518', 'warntype': '超限预警', 'passtime': '2025-04-06 10:14:39', 'bayonetname': '金汇港(北闸)'}, {'warntime': '2025-04-06 10:17:23', 'boatname': '兴安太518', 'warntype': '未申报预警', 'passtime': '2025-04-06 10:14:39', 'bayonetname': '金汇港(北闸)'}"""
# sql_result = ""

# action_name = "not matched"
# question = "统计一月份各卡口点的船舶通过数量，按照通过船舶数量降序排列，只显示通过量前10的卡口。"
# sql_result = """('黄浦江(松浦大桥南岸)', 24744), ('杭申线卡口', 14335), ('苏申内港线(上港宜东)', 6897), ('平申线省际检查站', 4634), ('大治河船闸', 4341), ('苏申外港线省际检查站', 3767), ('苏申内港线省际检查站', 3471), ('杨思船闸口', 2495), ('长湖申线卡口', 1797), ('油墩港(油墩港船闸)', 1749)"""
# # sql_result = ""

#     action_name = "spatial_computing_channel"
#     question = "黄浦江今年6月20日上午九点到十一点有哪些船经过"
#     sql_result = """[{'字段名': '船舶总数量', '值': 274}, {'字段名': '各类型船舶数量', '值': {'干货船': 172, '拖船': 3, '多用途船': 14, '散装水泥运输船': 13, '供给船': 1, '散装化学品船': 4, 'null': 31, '交通艇': 1, '杂货船': 1, '散货船': 23, '油污水处理船': 1, '油船': 8, '集装箱船': 1, '公务船': 1}}, {'字段名': '危险品船舶总数量', '值': {'危险品船': 0, '硫酸危险品': 0, '化学品液货船': 0, '一般液货船': 0, '包装危险品': 0, '包装危险品船': 0}}]"""
#     # sql_result = ""
#     session_messages = []
#
# print("\n开始生成分析报告：")
# try:
#     # 遍历生成器逐块处理
#     for content in analyze_boat_flow_api_data(question, sql_result, action_name, session_messages):
#         print(content, end="", flush=True)  # 外部处理实时输出
# except Exception as e:
#     print(f"请求失败: {str(e)}")
# finally:
#     print("\n数据分析完成")